<?php
require dirname(__DIR__).'/unit_test_conf.php';
require __DIR__.'/Class.php';
define('NAME', basename(__DIR__));

/**
 *	
 */
class UnitTest extends PHPUnit_Framework_TestCase
{
	################################################################################################################################
	#	1. Setting Basic varialbes for Testing..
	################################################################################################################################
	protected static $error;
	protected static $category_seq;
	
	################################################################################################################################
	#	2. Basic Method Testing..
	################################################################################################################################

	/**
	 * 
	 */
	public function testInsert4Class()
	{
		try
		{
			$o = Wdk::get(NAME);
			$o['category_name']			= utRc(rand(20,30));
			$o['category_private_flag']	= utRand('T', 'F');
			$o['parent_code']			= utRand('', 'AA', 'AB');
			$o->insert();
			self::$category_seq = $o['category_seq'];
			/************************************************************************************************************************/
			//	Compare Both Data..
			/************************************************************************************************************************/
			$c = Wdk::get(NAME);
			$c->load(self::$category_seq);
			$this->assertEquals($o['category_name']			, $c['category_name']			, "[Error] category_name");
			$this->assertEquals($o['category_code']			, $c['category_code']			, "[Error] category_code");
			$this->assertEquals($o['category_private_flag']	, $c['category_private_flag']	, "[Error] category_private_flag");
			/************************************************************************************************************************/
		}
		catch(WException $e)
		{
			self::$error = true;
			$this->assertTrue(False, 'Exception - '.$e->getMessage());
		}
	}
	
	
	/**
	 *	
	 */
	public function testUpdate4Class()
	{
		if(self::$error == true) return;
		try
		{
			$o = Wdk::get(NAME);
			$o->load(self::$category_seq);
			$o['category_name']			= utRc(rand(20,30));
			$o['category_private_flag']	= utRand('T', 'F');
			$o->update();
			
			/************************************************************************************************************************/
			//	Compare Both Data..
			/************************************************************************************************************************/
			$c = Wdk::get(NAME);
			$c->load(self::$category_seq);
			$this->assertEquals($o['category_name']			, $c['category_name']			, "[Error] category_name");
			$this->assertEquals($o['category_code']			, $c['category_code']			, "[Error] category_code");
			$this->assertEquals($o['category_private_flag']	, $c['category_private_flag']	, "[Error] category_private_flag");
			/************************************************************************************************************************/
		}
		catch(WException $e)
		{
			self::$error = true;
			$this->assertTrue(False, 'Exception - '.$e->getMessage());
		}
	}
	
	
	/**
	 *	
	 */
	public function testDelete4Class()
	{
		if(self::$error == true) return;
		try
		{
			$o = Wdk::get(NAME);
			$o->load(self::$category_seq);
			$o->delete();
			/************************************************************************************************************************/
			//	Compare Both Data..
			/************************************************************************************************************************/
			$c = Wdk::get(NAME);
			$c->load(self::$category_seq);
			$this->assertTrue(False, 'Exception - delete() ');
			/************************************************************************************************************************/
		}
		catch(NoRecordException $e)
		{
			//	ok
		}
		catch(WException $e)
		{
			self::$error = true;
			$this->assertTrue(False, 'Exception - '.$e->getMessage());
		}
	}
	
	################################################################################################################################
	#	3. Manager Method Testing..
	################################################################################################################################
	/**
	 * 
	 */
	public function testLoad4Manager()
	{
		if(self::$error == true) return;
		try
		{
			$cm = Wdk::get(NAME.'Manager');
			$cm->load();
		}
		catch(NoRecordException $e){}
		catch(WException $e)
		{
			self::$error = true;
			$this->assertTrue(False, 'Exception - '.$e->getMessage());
		}
	}
	
	################################################################################################################################
	#	4. Scenario Testing..
	#	-> a)
	################################################################################################################################
	/**
	 * 
	 */
	public function testScenarioA()
	{
		if(self::$error == true) return;
		try
		{
			$code1 = $this->createTempCategories();
			$code2 = $this->createTempCategories();
			$code3 = $this->createTempCategories();

			$o = Wdk::get(NAME);
			$o->loadByCode($code3);
			$o->move($code2);
			/************************************************************************************************************************/
			//	Compare Both Data..
			/************************************************************************************************************************/
			$c = Wdk::get(NAME);
			$c->loadByCode($o['category_seq']);
			$this->assertEquals($code2, $c['category_code'], "[Error] move up");
			/************************************************************************************************************************/
			
			$o = Wdk::get(NAME);
			$o->loadByCode($code1);
			$o->move($code2);
			/************************************************************************************************************************/
			//	Compare Both Data..
			/************************************************************************************************************************/
			$c = Wdk::get(NAME);
			$c->loadByCode($o['category_seq']);
			$this->assertEquals($code2, $c['category_code'], "[Error] move down");
			/************************************************************************************************************************/
			
			$o = Wdk::get(NAME);
			$o->loadByCode($code3);
			$o->move('');
			/************************************************************************************************************************/
			//	Compare Both Data..
			/************************************************************************************************************************/
			$c = Wdk::get(NAME);
			$c->loadByCode($o['category_seq']);
			$this->assertEquals($code1, $c['category_code'], "[Error] move top");
			/************************************************************************************************************************/
			
			$o = Wdk::get(NAME);
			$o->loadByCode($code1);
			$o->move($code3);
			/************************************************************************************************************************/
			//	Compare Both Data..
			/************************************************************************************************************************/
			$c = Wdk::get(NAME);
			$c->loadByCode($o['category_seq']);
			$this->assertEquals($code3, $c['category_code'], "[Error] move bottom");
			/************************************************************************************************************************/
			
		}
		catch(NoRecordException $e)
		{
			//	ok
		}
		catch(WException $e)
		{
			self::$error = true;
			$this->assertTrue(False, 'Exception - '.$e->getMessage());
		}
	}
	
	/**
	*
	*/
	public function testScenarioB()
	{
		return;
		if(self::$error == true) return;
		try
		{
			$code1 = $this->createTempCategories();
			$code2 = $this->createTempCategories();
			$code3 = $this->createTempCategories();
			$o = Wdk::get(NAME);
			$o->loadByCode($code1);
			$o2 = Wdk::get(NAME);
			$o2->loadByCode($code2);
			$o3 = Wdk::get(NAME);
			$o3->loadByCode($code3);
			$o2->move($code3);
			
			/************************************************************************************************************************/
			//	Compare Both Data..
			/************************************************************************************************************************/
			$c = Wdk::get(NAME);
			$c->loadByCode($o3['category_seq']);
			$this->assertEquals($o2['category_code'], $c['category_code'], "[Error] testScenarioA");
			/************************************************************************************************************************/
		}
		catch(NoRecordException $e)
		{
			//	ok
		}
		catch(WException $e)
		{
			self::$error = true;
			$this->assertTrue(False, 'Exception - '.$e->getMessage());
		}
	}
	
	/**
	*
	*/
	public function testScenarioC()
	{
		return;
		if(self::$error == true) return;
		try
		{
			$code1 = $this->createTempCategories();
			$code2 = $this->createTempCategories();
			$o = Wdk::get(NAME);
			$o->loadByCode($code1.'AA');
			$o2 = Wdk::get(NAME);
			$o2->loadByCode($code2.'AA');
			$o2->move($code1.'AA');
			
			/************************************************************************************************************************/
			//	Compare Both Data..
			/************************************************************************************************************************/
			$c = Wdk::get(NAME);
			$c->loadByCode($o2['category_seq']);
			$this->assertEquals($o2['category_code'], $c['category_code'], "[Error] testScenarioA");
			/************************************************************************************************************************/
		}
		catch(NoRecordException $e)
		{
			//	ok
		}
		catch(WException $e)
		{
			self::$error = true;
			$this->assertTrue(False, 'Exception - '.$e->getMessage());
		}
	}
	
	################################################################################################################################
	#	5. Testing tool Methods
	################################################################################################################################
	private function createTempCategories($p_code='', $num=1)
	{
		if(strlen($p_code) == 8) return;
		$o = Wdk::get(NAME);
		for($i=0; $i < $num; $i++)
		{
			$o['category_name']	= utRc(10);
			$o['parent_code']	= $p_code;
			$o->insert();
			$this->createTempCategories($o['category_code'], rand(1, 3));
		}
		return $o['category_code'];
	}
	private function removeTestData()
	{

	}
	public function setUp()
	{
		//	no need..
	}
	public function tearDown()
	{
		//	no need..
	}
	################################################################################################################################
}
?>